home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.OpenProm / sun4c.md / RCS / start.s,v < prev   
Text File  |  1991-09-01  |  3KB  |  152 lines

  1. head     1.1;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @! @;
  7.  
  8.  
  9. 1.1
  10. date     91.09.01.17.00.26;  author dlong;  state Exp;
  11. branches ;
  12. next     ;
  13.  
  14.  
  15. desc
  16. @sun4c version
  17. @
  18.  
  19.  
  20.  
  21. 1.1
  22. log
  23. @Initial revision
  24. @
  25. text
  26. @!
  27. ! The following variable MUST be the first thing in this
  28. ! file, as its position marks the beginning of small data
  29. !
  30.     .seg    "data"
  31.     .global    _environ        ! first symbol in sdata        
  32. _environ:
  33.     .word    0
  34. !
  35. ! This variable is used in the DELAY macro.  5 is the right value for
  36. ! 68010's running 10MHz.  3 is the right value for 68020's running 16MHz
  37. ! with cache on.  (4x as fast at doing the delay loop.)  Other values
  38. ! should be empirically determined as needed.  Srt0.s sets this value
  39. ! based on the actual runtime environment encountered.
  40. !
  41. ! For a sunrise machine with no cache (16Mhz) the delay should be 4
  42. ! if the cache is on the delay can be 1
  43. !
  44. ! It's critical that the value be no SMALLER than required, e.g. the
  45. ! DELAY macro guarantees a MINIMUM delay, not a maximum.
  46. !
  47.     .seg    "data"
  48.     .global    _cpudelay
  49. _cpudelay:
  50.     .word    5            ! Multiplier for DELAY macro.
  51.  
  52.     .seg    "text"
  53.     .align    4
  54. !
  55. ! Startup code for standalone system
  56. !
  57. WINDOWSIZE = (16 * 4)
  58.  
  59.     .global    _end
  60.     .global    _edata
  61.     .global    _main
  62.     .global    __exit
  63.     .global    _startKernel
  64.     .global _romp
  65.     .global    start
  66. start:
  67.     save    %sp, -WINDOWSIZE, %sp    ! get a new window, leave room for args
  68.     call    1f            ! get the current pc into o7
  69.     nop                ! (where entry is currently located)
  70. 1:
  71.         ba      realStart
  72.         nop
  73.     .skip    (8192)
  74. realStart:
  75.     mov    %o7, %o0        ! save for later
  76.     sub    %o0, 4, %o0        ! point to first byte of prog
  77.     set    start+4,%o6        ! address of call instruction - above 
  78.     cmp    %o6, %o7        ! are they the same
  79. #if 0
  80.     be    start
  81. #else
  82.     be    go
  83. #endif
  84.     nop
  85.     set    _edata+4, %o2        ! end of program, inclusive, except bss
  86.     set     start, %o1        ! beginning of program
  87.     sub    %o2, %o1, %o2        ! size of program
  88.     !
  89.     ! check that the following copy won't write on itself
  90.     !
  91.     !add    %o7,%o2,%o5
  92.     !cmp    %o5,%o0    
  93.     !bg    cantreloc
  94.     !nop
  95.     !
  96.     ! copy program where it belongs
  97.     !
  98. 2:
  99.     ld    [%o0], %o3        ! read a word
  100.     add    %o0, 4, %o0            ! point to next src word
  101.     st    %o3, [%o1]        ! write a word
  102.     subcc    %o2, 4, %o2            ! check if done
  103.     bge    2b            ! if not loop
  104.     add    %o1, 4, %o1        ! delay slot, point to next dest word
  105.  
  106.     set    go, %g1        ! now that it is relocated, jump to it
  107.     jmp    %g1
  108.     nop
  109.     ! program is now relocated
  110. go:
  111.     ! we should turn on cache at least by now
  112.     set    _romp, %o2
  113.     st    %i0, [%o2]
  114.     set    _end+4, %o2        ! end of bss
  115.     set    _edata, %o0        ! beginning of bss
  116.     sub    %o2, %o0, %o2        ! size of bss
  117.     ! zero the bss
  118. 1:
  119.     subcc    %o2, 1,    %o2            ! loop to zero bss
  120.     st    %g0,[%o0]
  121.     bnz    1b
  122.     add    %o0, 4, %o0
  123.  
  124.     ! general startup code
  125.     set    (_environ+0x1000), %g7    ! 1st global register (etext + 4K)
  126.     set    0x2000, %g6        ! 8k
  127.     add    %g7, %g6, %g6        ! 2nd global register (1st global + 8K)
  128.     ld    [%sp + WINDOWSIZE], %o0    ! argc
  129.     add    %sp, WINDOWSIZE + 4, %o1! argv
  130.     sll    %o0, 2, %o2        ! argc * sizeof (int)
  131.     add    %o2, 4, %o2        ! skip 0 at end of arg ptrs
  132.     add    %o1, %o2, %o2        ! environ ptr
  133.     call    _main
  134.     st    %o2, [%g7 + -0x1000]    ! store 1st word of sdata %ad(_environ)
  135.     nop
  136. #ifdef notdef
  137.     call    _exit            ! exit(0)
  138. #endif
  139.     mov    0, %o0            ! delay slot
  140. __exit:
  141.     ret                ! ret to prom
  142.     restore
  143. _romp:
  144.     .word 0
  145. _startKernel:
  146.     mov    %o0, %g1
  147.     mov    %o1, %i0        ! preserve some arguments
  148.     mov    %o2, %i1        ! preserve some arguments
  149.     jmp    %g1
  150.     restore
  151. @
  152.